PHP製監視ツール Cacti (URL監視編)
本日の課題
こんにちは植木和樹です。本日はサーバの監視について取り上げたいと思います。Webサーバーを立てたらサービスが正常に稼働しているかチェックしておきたいものです。さらに異常を検知してメールで通知を受けることができれば、なるべく早く原因調査と対応に着手することができ、機会損失を最小限に抑えることができます。
さて監視となると「監視ツール」を利用するのが機能も豊富で設定も簡単です。そんな監視ツールが世にはたくさん溢れています。オープンソース・ソフトウェアだとZabbix、Nagios、Muninなどが代表的なところでしょうか。本日は「Cacti(カクタイ)」という監視ツールを使ったURL監視をご紹介したいと思います。
2013年8月24日にCactiでURLの監視ができるプラグインがリリースされました。本日はこのプラグインを使った監視を試してみたいと思います。それでは設定していきましょう。
Cacti URL監視プラグイン「mURLlin」
Cactiは「プラグイン」という仕組みを使うことで機能を拡張することができます。公式サイトでは様々なプラグインが紹介されています。この中空CactiでURL監視をするためのプラグイン「mURLlin」を使用してみました。
mURLlinでは指定したURLにリクエストを送信し「レスポンスが返ってくるまでの時間」と「レスポンスのステータスコード」を監視することができます。またレスポンスとして返ってくるBODYに特定の文字列が含まれているかを正規表現でチェックすることもできます。これにより特定のページが時間内に正しいレスポンスを返してくるかが監視できます。
Cacti 閾値監視プラグイン「thold」
mURLlinプラグイン単体ではデータの収集とグラフ表示のみ行います。収集したデータ(レスポンスタイムとステータスコード)がある範囲内に収まっているかのチェックと、範囲外の異常データだった場合にメール通知を行う機能は別途「thold」プラグインで行います。
tholdプラグインは「Warning(警告域) / Alert(エラー域)」に対してそれぞれ「High / Low」の閾値を設定できます。また以下のような機能もあり、それなりに細かく通知設定を行うことができます。
- 週末は監視を行わない(Weekend Exemption)
- 異常から回復した場合にメール通知する(デフォルトで有効。無効にする場合は Disable Restoration Email)
- 初回の異常検知だけでなく継続して異常状態なら再通知(Re-Alert Cycle)
- 連続して異常検知した場合のみ通知(Breach Duration)
- 取得した値そのままでなくCDEF(逆ポーランド記法を用いた値の操作)などで前処理した値をチェック(Data Type)
- 通知先を警告域、エラー域、特定の監視対象などで変更する(Notification List)
- 上記の監視設定をテンプレート化し複数ホスト共通で適用する(Template Propagation Enabled)
Cactiのインストール
まずはCactiをインストールします。使用したバージョンはVersion 0.8.8bです。今回はCactiのインストール自体は本題ではないため細かい説明は省略させてもらいます。
Cactiは内部データの保持にMySQLを利用します。今回はRDSを利用しました。
- データベース名
- cacti
- ユーザー名
- cactiuser
- パスワード
- cactipass
yumでパッケージをインストールします。その後apache, cacti, php, cronの設定を少々変更しています。
$ sudo yum install httpd24 cacti net-snmp-utils -y $ sudo vi /etc/httpd/conf.d/cacti.conf deny from all を無効にする Require all granted $ sudo vi /etc/php.ini [Date] date.timezone = "Asia/Tokyo" $ sudo chkconfig httpd on $ sudo service httpd start $ sudo vi /etc/cacti/db.php $database_default = "cacti"; $database_hostname = "cacti.xxxxxx.ap-northeast-1.rds.amazonaws.com"; $database_username = "cactiuser"; $database_password = "cactipass"; $ sudo vi /etc/cron.d/cacti cronを有効にする(コメントを外す)
Apacheが起動したらhttp://cacti.example.com/cacti/のURLにアクセスすると、セットアップ画面が表示されます。特に初期設定から変更することはないので、画面の指示に従って設定を完了してください。その後Cactiデフォルトの管理者ユーザーとパスワードでログインできればインストールは完了です。
RDSを利用してCactiを使用すると「DB Instance cacti contains MyISAM tables that have not been migrated to InnoDB. 」というメッセージが通知されます。これはCactiが使用するテーブルがMyISAM形式で作成されるため、RDSのpoint-in-timeリストア機能が使えませんよ、というメッセージです。実害はないのでひとまずそのままにしておいてください。
プラグインのインストール
次にプラグインをインストールします。インストールするプラグインは次の3つです。tholdプラグインを設定するためにsettingsプラグインが必要です。
- mURLin-v0.1.3(アーカイブは mURLin-0.1.5.tar.gz)
- thold-v0.5.0
- settings-v0.71-1
まずはそれぞれアーカイブファイルをプラグインページからダウンロードします。その後scpなどの手段でCactiサーバの/tmpなどにコピーしておきてください。そしてプラグインのアーカイブをCactiのpluginsディレクトリで展開します。mURLinプラグインは展開した後にオーナーと権限を修正しないといけないようです。
$ sudo -s # cd /usr/share/cacti/plugins # tar xvzf /tmp/thold-v0.5.0.tgz # tar xvzf /tmp/mURLin-0.1.5.tar.gz # tar xvzf /tmp/settings-v0.71-1.tgz # chown -R root:root mURLin # chmod -R go+r mURLin # find mURLin -type d | xargs chmod go+rx
アーカイブを展開したらブラウザでCactiにログインします。[Console]タブの[Configuration/Plugin Management]のページを開きます。
アーカイブが正しく展開されていれば一覧にそのプラグインが表示されているはずです。
一番左の青い下向き矢印をクリックするとインストール処理が実行され赤い上向き矢印のアイコンに変わります。
矢印アイコンの右に緑色の矢印アイコンが現れるのでクリックするとプラグインが有効になります。
赤い上向き矢印をクリックするとプラグインのアンインストール処理が実行され、設定したプラグインデータがすべて消えてしまいます。気をつけましょう。
監視対象デバイスの登録
まずは監視対象デバイスを登録します。[Console]タブの[Management/Devices]のページを開きます。ページ右上にある[Add]をクリックすると新規デバイスの登録画面になります。Cactiは本来SNMPを用いてデータ収集を行うためSNMP関連の設定を行うのですが、今回はURL監視に必要となる設定のみを行います。
- General Host Options
- Description ... 画面に表示されるデバイス名(ホスト名や"WebServer"などにしておく)
- Hostname ... デバイスのホスト名またはIPアドレス
- Availability/Reachability Options
- Downed Device Detection ... "Ping"(ホストの死活監視手段)
- Ping Method ... "TCP Ping"
- Ping Port ... "22" または "80"(監視するポート)
- Ping Retry Count ... 何回pingに失敗したらデバイスダウンと判断するか(たまに失敗するので2にしておくと良し)
- SNMP Options
- SNMP Version ... "Not In Use"(ひとまず今回はSNMPは使用しない)
入力したらページ右下の[Create]ボタンをクリックしてデバイスを登録します。
URL監視設定
[mURLin]タブをクリックしページ右上にある[Add]をクリックして監視URL登録画面を開きます。
[Select Host]ボタンをクリックして、このURL監視を紐付けるデバイスを選択します。
監視するURLを入力します。入力したら[Open URL]ボタンをクリックして問題なくページが開けるか確認しておきましょう。
[ Text Matching - Text to Match]にはレスポンスとして返されるBODYに含まれるべき文字列を指定します。/foobar/のように正規表現で入力してください(スラッシュで囲むのを忘れないように!)。
[Timeout]にはレスポンスが返るのを待つタイムアウトの秒数を設定します。ひとまず30秒くらいにしておきましょう。
入力したらページ右下の[Save]ボタンをクリックして監視URLを登録します。
監視するURLをデバイスに紐付けただけでは、まだ監視は実行されません。デバイス画面でグラフ表示(とデータ収集)を有効にしてあげる必要があります。[Console]タブの[Management/Devices]のページで登録したデバイスを開きます。
ページ下部にある[Associated Data Queries]で"mURLlin - URL Agent"を選択したら[Add]します。
次にページ上部にある[Create Graphs for this Host]をクリックしてグラフ追加画面を開きます。
[Data Query]にある"mURLin - URL Agent"のURLにチェックを入れてページ右下の[Create]ボタンをクリックします。
ここまででURL監視設定自体は完了です。cronで5分毎にデータを収集しているため、10〜15分ほどするとグラフが表示されるようになるはずです。
メール通知設定
URLレスポンスデータの収集設定が終わったのでデータの閾値監視を設定したいのですが、作業の都合上、異常を検知した際のメール通知を先に設定します。
[Console]タブの[Notification Lists]をクリックし通知先設定の画面を開き、表示されたページ右上にある[Add]をクリックして通知先登録画面を開きます。
「通知先名(Name)」、「説明(Description)」、「メールアドレス(Email Addresses)」を入力します。メールアドレスはカンマ区切りで複数指定できますが、改行で区切ることはできないので注意してください。
入力したら[Create]ボタンをクリックして設定を保存します。
メールの送信設定は[Configuration]-[Settings]の[Mail/DNS]で行います。EC2ではメール送信制限解除をしないとメールが正しく配信されないかもしれません。
閾値監視設定
さてmURLlinによるURL監視で収集したデータをtholdプラグインを使って閾値監視する設定をしていきます。設定する閾値は「レスポンスタイム」と「ステータスコード」の2種類です。
閾値設定はURL個別に設定しても良いのですが、せっかくなのでtholdのテンプレート機能を使ってみましょう。[Console]タブの[Templates/Threshold Templates]をクリックし、表示されたページ右上にある[Add]をクリックして新規閾値監視登録画面を開きます。
レスポンスタイム監視テンプレートを作成する
[Data Template]に"mURLin - URL Agent"、[Data Source]に[values]を選択したら[Create]ボタンをクリックします。
監視閾値設定を行います。初期設定でもさほど問題ないので、Alert(エラー)閾値となる[High/Low Settings]の[High Threshold]を10に設定します。サイトトップページがレスポンスに10秒以上かかるのは問題なのでエラーと判断することにしました。
また値が警告域、エラー域になった時のメール通知先を、それぞれ[Warning Notification List]、[Alert Nortification List]で設定します。先ほど作成した通知先をプルダウンメニューから選択します。
初期+上記設定だと次のような挙動になります。
- 週末も監視する ... Weekend Exemption:オフ
- エラーから回復したらメールで通知する ... Disable Restoration Email:オフ
- 1時間毎に再通知する ... Re-Alert Cycle:Every Hour
- 警告域は設定しない ... High / Low Warning Settings 入力しない
- レスポンスに10秒より長くかかったらエラーにする ... High / Low Settings - High Threshold:10
- 初回検知でも通知する ... High / Low Settings - Min Trigger Duration:5 Minutes
- エラー域になったら"classmethod - aws team"にメール通知する
設定で問題なければページ右下の[Save]をクリックして設定を保存します。
ステータスコード監視テンプレートを作成する
レスポンスタイムと同様にステータスコードの監視も行います。[Data Template]に"mURLin - URL Agent"、[Data Source]に[http_code]を選択したら[Create]ボタンをクリックします。
監視閾値設定を行います。今度は警告(Warning)も設定してみましょう。ステータスコードが4xxならWarning、5xxならAlertになるよう設定します。閾値は設定した値「より大きい」と異常と検知されるため[High Warning Threshold]には399を[High Threshold]には499を設定します。
[Nortificaion List]でメール通知先も設定したら、ページ右下の[Save]をクリックして設定を保存します。
データと監視テンプレートを関連付ける
2種類の監視テンプレートを作成したので収集したデータと関連付けましょう。[Console]タブの[DataSources]をクリックし、収集しているデータ(DataSource)の一覧を表示します。一覧からテンプレートを関連付けるデータソースをチェックします。[Template Name]を”mURLin - URL Agent”で絞り込むと作業しやすいでしょう。
データソースをチェックしたらページ右下の[Choose an action]で"Create Threshold from Template"を選択して[Go]をクリックします。
[Select a Threshold Template]で"mURLin - URL Agent [values]"を選択し[Continue]をクリックします。これで選択したデータソースと"レスポンスタイム監視"を関連付けることができました。
同様に”ステータスコード監視”と関連付けましょう。[Select a Threshold Template]で"mURLin - URL Agent [http_code]"を選択し[Continue]をクリックします。
[Console]タブの[Thresholds]をクリックすると閾値監視の一覧が表示されます。レスポンスタイム(values)とステータスコード(http_code)が監視されていることを確認してください。
監視確認
監視設定が完了したら正しく検知できるか確認しましょう。ただサイトのエラーになるまで待つと時間がかかるので、レスポンスタイムを0.1秒、ステータスコードを199(200の正常時も異常と検知)のように変更して確認してみます。
tholdプラグインが異常を検知すると[thold]タブの[Thresholds]には現在のスタータスが、[Log]にはこれまでの検知履歴が表示されます。
またNortified Listに設定したメールアドレスにエラー検知メールが届いているか確認しましょう。
HTMLメールを有効にするとメールでグラフも確認できます!
おさらい
手順をおさらいしてみました。文章だと長々と書かれていて複雑に見えますが、実際に設定してみれば数分で設定できるかと思います。
- デバイスを登録する
- mURLinページで監視するURLを設定しデバイスに関連付ける
- デバイスページでmURLinグラフを追加しデータ収集を開始する
- 異常時の通知先を設定する
- tholdテンプレートを作成し閾値と通知先を設定する
- データソースとtholdテンプレートを関連付ける
別のホストに対して同様のURL監視を行う場合は次の手順になります。
- デバイスを登録する
- mURLinページで監視するURLを設定しデバイスに関連付ける
- デバイスページでmURLinグラフを追加しデータ収集を開始する
- データソースとtholdテンプレートを関連付ける
まとめ
今回はCacti(カクタイ)を使ったURL監視の設定をご紹介しました。実際の運用時にはURL監視だけでなく、SNMPを用いたCPU使用率やメモリ使用率などの情報とあわせて確認することで、性能劣化がどこに起因するものなのか判断する材料になるかと思います。
Cactiでは他にもMonitorプラグインを用いた全ホストの状況を俯瞰的にみることができる機能や、カスタムスクリプトを用いた独自の監視追加ができる機能があります。筆者はCactiを使った監視運用を6年ほどしてきましたので、機会があれば運用ノウハウも含めてCacti便利さをご紹介をするエントリが書ければと思っています。